import org.junit.Test;

import java.util.*;

/**
 * @description:集合遍历使用迭代器Iterator接口
 * @author:Mr.Cat
 * @create:2021-10-22 16:58
 **/
public class IteratorTest {
    @Test
    public void test1() {
        Collection coll = new ArrayList();
        LinkedList link = new LinkedList();
        coll.add(123);
        coll.add(456);
        coll.add(false);
        Iterator iterator = coll.iterator();
//       方式一：
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
        //下面会报错：NoSuchElementException
//        System.out.println(iterator.next());


        //方式二：开发中不推荐
//        for(int i=0;i<coll.size();i++){
//            System.out.println(iterator.next());
//        }

//        方式三：推荐
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    @Test
    public void test2() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(false);

        Iterator iterator = coll.iterator();
        //错误方式一：会跳着输出以及NoSuchElementException报错
//        while (iterator.next() != null){
//            System.out.println(iterator.next());
//        }
        //错误方式二：
        //集合对象每次调用iterator()方法都的得到一个全新的迭代器对象，默认游标都在集合的第一个元素之前
        while (coll.iterator().hasNext()) {
            System.out.println(iterator.next());
        }
    }


    //测试Iterator中的remove
    //remove是迭代器对象的方法。如果还未调用next()后在上一次调用next方法之后已经调用了remove方法，
    // 再调用remove都会报IllegalStateException。
    @Test
    public void test3() {
        Collection coll = new ArrayList();
        coll.add("123");
        coll.add(456);
        coll.add(false);

        //删除集中"123"的数据
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()) {
            Object obj = iterator.next();
            if ("123".equals(obj)) {
                iterator.remove();
            }
        }
        iterator = coll.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

